package internal

import (
	"time"
)

// ==================== 用户相关 ====================

// WecomUser 企业微信员工信息表
type WecomUser struct {
	ID        int       `gorm:"primaryKey;autoIncrement;column:id" json:"id"`                                            // 主键ID
	UserID    string    `gorm:"type:varchar(64);uniqueIndex:userid_unique;column:userid;comment:成员UserID" json:"userid"` // 成员UserID
	Name      string    `gorm:"type:varchar(32);column:name;comment:真实名称" json:"name"`                                   // 真实名称
	Alias     string    `gorm:"type:varchar(32);index:alias;column:alias;comment:标识-真实名称首字母小写" json:"alias"`             // 标识-真实名称首字母小写
	Status    int8      `gorm:"type:tinyint(4);column:status;comment:激活状态: 1=已激活，2=已禁用，4=未激活，5=退出企业" json:"status"`      // 激活状态
	CreatedAt time.Time `gorm:"autoCreateTime;column:created_at" json:"created_at"`                                      // 创建时间
	UpdatedAt time.Time `gorm:"autoUpdateTime;column:updated_at" json:"updated_at"`                                      // 更新时间
}

// TableName 指定表名
func (u *WecomUser) TableName() string {
	return "wecom_users"
}

// UserStatus 用户状态常量
const (
	UserStatusActivated   int8 = 1 // 已激活
	UserStatusDisabled    int8 = 2 // 已禁用
	UserStatusInactivated int8 = 4 // 未激活
	UserStatusQuit        int8 = 5 // 退出企业
)

// GetStatusText 获取状态文本描述
func (u *WecomUser) GetStatusText() string {
	switch u.Status {
	case UserStatusActivated:
		return "已激活"
	case UserStatusDisabled:
		return "已禁用"
	case UserStatusInactivated:
		return "未激活"
	case UserStatusQuit:
		return "退出企业"
	default:
		return "未知状态"
	}
}

// IsActive 判断用户是否处于活跃状态
func (u *WecomUser) IsActive() bool {
	return u.Status == UserStatusActivated
}

// ==================== 消息相关 ====================

// MessageRequest 消息发送请求
type MessageRequest struct {
	UserAlias string   `json:"user_alias" binding:"required"` // 用户别名（用于对外发送消息）
	Title     string   `json:"title,omitempty"`               // 消息标题
	Content   []string `json:"content,omitempty"`             // 消息内容
}

// Article 图文消息文章
type Article struct {
	Title       string `json:"title"`       // 标题
	Description string `json:"description"` // 描述
	URL         string `json:"url"`         // 链接
	PicURL      string `json:"pic_url"`     // 图片URL
}

// MessageResponse 消息发送响应
type MessageResponse struct {
	Code    int    `json:"code"`    // 响应码
	Message string `json:"message"` // 响应消息
	Data    any    `json:"data"`    // 响应数据
}

// WecomMessageRecord 企业微信消息发送记录
type WecomMessageRecord struct {
	ID          int       `gorm:"primaryKey;autoIncrement;column:id" json:"id"`
	MessageType string    `gorm:"type:varchar(32);column:message_type;comment:消息类型" json:"message_type"`
	ToUser      string    `gorm:"type:varchar(64);column:to_user;comment:接收用户ID" json:"to_user"`
	UserAlias   string    `gorm:"type:varchar(32);column:user_alias;comment:用户别名" json:"user_alias"`
	Title       string    `gorm:"type:varchar(255);column:title;comment:消息标题" json:"title"`
	Content     string    `gorm:"type:text;column:content;comment:消息内容" json:"content"`
	Status      string    `gorm:"type:varchar(32);column:status;comment:发送状态" json:"status"`
	ErrorMsg    string    `gorm:"type:text;column:error_msg;comment:错误信息" json:"error_msg"`
	CreatedAt   time.Time `gorm:"autoCreateTime;column:created_at" json:"created_at"`
	UpdatedAt   time.Time `gorm:"autoUpdateTime;column:updated_at" json:"updated_at"`
}

// TableName 指定表名
func (m *WecomMessageRecord) TableName() string {
	return "wecom_message_records"
}

// ==================== 响应处理 ====================

// BaseResponse 基础响应结构
type BaseResponse struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Data    interface{} `json:"data,omitempty"`
}

// ==================== 枚举常量 ====================

// MessageType 消息类型
type MessageType string

const (
	MessageTypeMarkdown MessageType = "markdown" // Markdown消息
	MessageTypeText     MessageType = "text"     // 文本消息
	MessageTypeImage    MessageType = "image"    // 图片消息
	MessageTypeFile     MessageType = "file"     // 文件消息
	MessageTypeNews     MessageType = "news"     // 图文消息
	MessageTypeCard     MessageType = "card"     // 卡片消息
)

func (m *MessageType) Desc() string {
	var typeDesc = map[MessageType]string{
		MessageTypeMarkdown: "Markdown消息",
		MessageTypeText:     "文本消息",
		MessageTypeImage:    "图片消息",
		MessageTypeFile:     "文件消息",
		MessageTypeNews:     "图文消息",
		MessageTypeCard:     "卡片消息",
	}
	return typeDesc[*m]
}

// IsValid 检查消息类型是否有效
func (m *MessageType) IsValid() bool {
	switch *m {
	case MessageTypeMarkdown, MessageTypeText, MessageTypeImage, MessageTypeFile, MessageTypeNews, MessageTypeCard:
		return true
	default:
		return false
	}
}

// SendMsgStatus 发送消息状态
type SendMsgStatus string

const (
	SendMsgStatusWaiting SendMsgStatus = "WAITING"
	SendMsgStatusSuccess SendMsgStatus = "SUCCESS"
	SendMsgStatusFail    SendMsgStatus = "FAIL"
)

func (s *SendMsgStatus) Desc() string {
	var statusDesc = map[SendMsgStatus]string{
		SendMsgStatusWaiting: "待发送",
		SendMsgStatusSuccess: "发送成功",
		SendMsgStatusFail:    "发送失败",
	}
	return statusDesc[*s]
}
